package com.zy.je.common.core.model;

import com.zy.je.common.core.constant.StringPool;
import com.zy.je.common.core.utils.reflection.Fn;
import com.zy.je.common.core.utils.reflection.Reflection;

import java.util.Map;

/**
 * 参数翻译类
 * @author zy
 */
public interface  ResultMap {
//    /**
//     * 扩展的返回结果--用于保存字段的翻译
//     */
//    @ApiParam(hidden = true)
//    protected Map<String, Object> _r;


      Map<String,Object> buildR();

    default Map<String, Object> addMapResult(String key, Object value) {
        Map<String, Object> r = buildR();
        r.put(key, value);
        return r;
    }

    default <T> Map<String, Object> addMapResult(Fn<T, ?> fn, Object value) {
        return addMapResult(StringPool.UNDERSCORE.concat(Reflection.fnToFieldName(fn)), value);
    }

    default <T> Map<String, Object> addMapResultRaw(Fn<T, ?> fn, Object value) {
        return addMapResult(Reflection.fnToFieldName(fn), value);
    }

    default <T, R> R getMapResultValue(Fn<T, ?> fn, Class<R> cls) {
        return getMapResultValue(StringPool.UNDERSCORE.concat(Reflection.fnToFieldName(fn)), cls);
    }

    default Object getMapResultValue(String key) {
        return buildR().get(key);
    }

    default <V> V getMapResultValue(String key, Class<V> cls) {
        Object v = buildR().get(key);
        if (null != v) {
            if (v.getClass().equals(cls)) {
                return (V) v;
            } else {
                return null;
            }
        }
        return null;
    }
}
